package com.yodel.www.tenhou;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ToggleButton;

/**
 * 初期画面アクティビティ
 * @author yodel
 *
 */
public class MainActivity extends Activity {

	/**
	 *  ユーザ情報一覧のリスト
	 */
	private List<UserInfo> mUserInfoList = null;

	/**
	 *  sanma ユーザ情報一覧のリスト
	 */
	private List<UserInfo> mSanmaUserInfoList = null;

	/**
	 *  ユーザ情報一覧
	 */
	private UserInfo userBean = new UserInfo();

	/**
	 * ユーザ情報アダプタ
	 */
	private UserArrayAdaptor mAdapter = null;

	/**
	 * プログレスバー
	 */
	ProgressBar mProgress;


	/**
	 * 初期生成時
	 */
	@Override
	public void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		LogUtils.d(getClass().getName() + "#" + Thread.currentThread().getStackTrace()[2].getMethodName());

		//リストの初期化
		mUserInfoList = new ArrayList<UserInfo>();
		mSanmaUserInfoList = new ArrayList<UserInfo>();
		HttpTask mTask = new HttpTask(getApplicationContext());
		mTask.execute();

		mProgress = (ProgressBar) findViewById(R.id.progressBar);



		doSort(mUserInfoList, new UserInfoComparator(false, "Rate"));
		mAdapter = new UserArrayAdaptor(this, R.layout.custom_list, mUserInfoList);
		ListView lv = (ListView) findViewById(R.id.listView);
		lv.setAdapter(mAdapter);



		ToggleButton tb = (ToggleButton) findViewById(R.id.toggleButton1);
		tb.setTextOff("サンマ");
		tb.setTextOn("ヨンマ");  //トグルボタンのメッセージ
		tb.setChecked(false);       //OFFへ変更

		//ToggleのCheckが変更したタイミングで呼び出されるリスナー
		tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					//トグルキーが変更された際に呼び出される
					doSort(mUserInfoList, new UserInfoComparator(false, "Rate"));
					mAdapter = new UserArrayAdaptor(getApplicationContext(), R.layout.custom_list, mUserInfoList);

				} else {
					doSort(mUserInfoList, new UserInfoComparator(true, "Rate"));
					mAdapter = new UserArrayAdaptor(getApplicationContext(), R.layout.custom_list, mSanmaUserInfoList);
				}
				ListView lv = (ListView) findViewById(R.id.listView);
				lv.setAdapter(mAdapter);
				Log.d("ToggleButton","call OnCheckdChangeListener");

			}
		});

//		ToggleButton tb2 = (ToggleButton) findViewById(R.id.toggleButton2);
//		tb2.setTextOff("昇順");
//		tb2.setTextOn("降順");  //トグルボタンのメッセージ
//		tb2.setChecked(false);       //OFFへ変更
//
//		//ToggleのCheckが変更したタイミングで呼び出されるリスナー
//		tb2.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//
//			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//				if (isChecked) {
//					//トグルキーが変更された際に呼び出される
//					doSort(mSanmaUserInfoList, new UserInfoComparator(false, "Rate"));
//				} else {
//					doSort(mSanmaUserInfoList, new UserInfoComparator(true, "Rate"));
//				}
//				mAdapter = new UserArrayAdaptor(getApplicationContext(), R.layout.custom_list, mSanmaUserInfoList);
//				ListView lv = (ListView) findViewById(R.id.listView);
//				lv.setAdapter(mAdapter);
//				Log.d("ToggleButton","call OnCheckdChangeListener");
//
//			}
//		});
	}

	/**
	 * 一覧更新ボタンを押した時の処理
	 */
	public void onClickUpdate(View v){
		HttpTask mTask = new HttpTask(getApplicationContext());
		mTask.execute();

		ToggleButton tb = (ToggleButton) findViewById(R.id.toggleButton1);
		tb.setChecked(true);       //OFFへ変更

	}

	/**
	 * HogeBeanリストをHogeComparatorを使ってソートします。
	 * @param list
	 * @param comparator
	 */
	private void doSort(final List<UserInfo> list, Comparator<UserInfo> comparator) {
		Collections.sort(list, comparator);
	}


	/**
	 * 天鳳情報をHTTP処理で取得するクラス
	 * @author yodel
	 *
	 */
	private class HttpTask extends AsyncTask<Void, Void, Long>{

		/**
		 * 情報取得先URL
		 */
		private static final String HTTP_URL = "http://tenhou.net/0/wg/0000.js";

		/**
		 * コンテキスト
		 */
		Context mContext;



		/**
		 * コンストラクタ
		 * @param context
		 */
		public HttpTask(Context context){
			this.mContext = context;
			mUserInfoList = new ArrayList<UserInfo>();

		}

		/**
		 * 実行前の準備処理
		 */
		@Override
		protected void onPreExecute() {
			LogUtils.d("onPreExecute");

			mProgress = (ProgressBar) findViewById(R.id.progressBar);
			mProgress.setVisibility(View.VISIBLE);


		}

		/**
		 * 実行処理
		 * @return
		 */
		@Override
		protected Long doInBackground(Void... values) {
			LogUtils.d("doInBackground - ");

			try {
				doHttpURLConnection();
			} catch (MalformedURLException e) {
				LogUtils.e("エラー発生", e);
			} catch (ProtocolException e) {
				LogUtils.e("エラー発生", e);
			} catch (IOException e) {
				LogUtils.e("エラー発生", e);
			}
			return 1L;
		}


		/**
		 * 実行中の進捗処理
		 */
		@Override
		protected void onProgressUpdate(Void... values) {
			LogUtils.d("onProgressUpdate - " + values[0]);
			//			mDialog.setProgress(values[0]);
		}


		/**
		 * 完了時処理
		 */
		@Override
		protected void onPostExecute(Long result) {
			LogUtils.d("onPostExecute - " + result);
			//			mDialog.dismiss();

			mProgress = (ProgressBar) findViewById(R.id.progressBar);
			mProgress.setVisibility(View.GONE);

			doSort(mUserInfoList, new UserInfoComparator(false, "Rate"));
			mAdapter = new UserArrayAdaptor(mContext, R.layout.custom_list, mUserInfoList);
			ListView lv = (ListView) findViewById(R.id.listView);
			lv.setAdapter(mAdapter);
		}


		/**
		 * Http通信処理
		 * @throws IOException
		 */
		private  void doHttpURLConnection()	throws IOException {
			LogUtils.d(getClass().getName() + "#" + Thread.currentThread().getStackTrace()[2].getMethodName());

			URL url = new URL(HTTP_URL);

			HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
			urlconn.setRequestMethod("GET");
			urlconn.setInstanceFollowRedirects(false);
			urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");
			urlconn.connect();

			Map<String, List<String>> headers = urlconn.getHeaderFields();
			Iterator<String> it = headers.keySet().iterator();

			LogUtils.v("レスポンスヘッダ");
			while (it.hasNext()) {
				String key = it.next();
				LogUtils.v("  " + key + ": " + headers.get(key));
			}
			LogUtils.v("レスポンスコード:[" + urlconn.getResponseCode()+"] " + "レスポンスメッセージ:[" +
					urlconn.getResponseMessage() + "]");
			LogUtils.v("\n---- ボディ ----");
			BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream()));

			//行番号
			int lineCounter = 0;
			//Body部分の読み込み
			while (true) {
				lineCounter++;
				String line = reader.readLine();

				//行がNULLになるまでWHILEループ
				if (line == null) {
					break;
				}

				if (line.equals("sw([") || line.equals("]);")) {
					//先頭行と末尾行に関しては、表示しない。
				} else {
					//1.URL
					//2.INTURL情報
					//3.String時間
					//4.String名前BASE64
					//5.INT段
					//6.Rate

					line = line.replace("\"", "");
					String[] field = line.split(",");

					//1卓に4人分の情報が入っている
					for (int i = 1; i < 4; i++) {
						//毎回新しいインスタンスを作成して詰める必要がある
						userBean = new UserInfo();
						userBean.setUrlInfo(field[0]);
						userBean.setWakaranInfo(field[1]);
						userBean.setStartTime(field[2]);

						int intTakuInfo = Integer.parseInt(field[3]);


						//三麻かどうか
						final int sanma = 16;
						if ((intTakuInfo & sanma) == sanma) {
							//卓
							userBean.setSanmaFlag(true);
						} else {
							userBean.setSanmaFlag(false);
						}


						//鳳凰卓かどうか
						final int houou = 128;
						//final int toku  = 32; 特上か鳳凰卓なので特上卓は考慮しない
						if ((intTakuInfo & houou) == houou) {
							//鳳凰卓フラグを立てる
						}

						final int akasoku   = 65;
						final int kuinashi  = 7;
						final int kuiari    = 3;
						final int kuiariaka = 1;

						if ((intTakuInfo & akasoku) == akasoku){
						}

						userBean.setTakuInfo(Integer.parseInt(field[3]));
						userBean.setPlayerName(new String(Base64.decode(field[3 * i + 1],Base64.DEFAULT)));
						userBean.setRank(Integer.parseInt(field[3 * i + 2]));
						userBean.setRate(Float.parseFloat(field[3 * i + 3]));

						if ((intTakuInfo & sanma) == sanma) {
							mSanmaUserInfoList.add(userBean);
						} else {
							mUserInfoList.add(userBean);
						}
					}
				}
			}
			//後始末
			reader.close();
			urlconn.disconnect();
		}
	}
}
